/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.nys.conci.usuario.bean;

import com.nys.conci.base.BeanBase;
import com.nys.conci.base.excepcion.ExcepcionManager;
import com.nys.conci.base.utilitario.EncriptaUtil;
import com.nys.conci.base.utilitario.EtiquetasUtil;
import com.nys.conci.base.utilitario.MensajeUtil;
import com.nys.conci.base.validador.EmailValidator;
import com.nys.conci.cliente.entidad.Cliente;
import com.nys.conci.cliente.entidad.Persona;
import com.nys.conci.usuario.entidad.EstadoUsuario;
import com.nys.conci.usuario.entidad.Usuario;
import com.nys.conci.usuario.servicio.ServicioAdministracion;
import com.nys.conci.usuario.servicio.ServicioControlUsuario;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.inject.Inject;

/**
 *
 * @author Yeudy10
 * @since 21/02/2013
 */
@ManagedBean
@ViewScoped
public class BeanRegistroUsuario extends BeanBase {

    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<     VARIABLES     >>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    @Inject
    private ServicioControlUsuario scu;
    @Inject
    private ServicioAdministracion sa;
    private List<Persona> lista_usuarios;
    private List<EstadoUsuario> lista_estados;
    private Usuario usuario;
    private Persona persona_select;
    private Persona Persona_tabla;
    private Persona persona;
    private String identificacion;
    private String nombre;
    private String apellido1;
    private String apellido2;
    private String nacionalidad;
    private Date fecha_nacimiento;
    private String sexo;
    private String telefono1;
    private String telefono2;
    private Integer estado;
    private String estadoCivil;
    private String email;
    private String tipo;
    private String direccion;
    private String password;
    private String rep_password;
    private boolean modificar;
    private boolean habilitar;
    private boolean mostrar_estado;

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<  INICIALIZARORES  >>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    /**
     * Constructor
     */
    public BeanRegistroUsuario() {
        this.inicializar();
    }

    /**
     * Inicializa las variables del bean, al acceder al constructor
     */
    private void inicializar() {
        try {
            mostrar_estado = false;
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    /**
     * Inicializas las variables y atributos del bean, despues del llamado del
     * constructor. Es utilizado para las inicializaciones que utilicen datos de
     * objetos injectados.
     */
    @Override
    @PostConstruct
    public void inicializarPost() {
        lista_usuarios = new ArrayList<Persona>();
        limpiar();
        cargarEstadoUsuarios();

    }
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<      MÉTODOS      >>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<

    /**
     * Método encargado de limpiar los campos para manipular un usuario
     */
    public void limpiar() {

        persona_select = new Persona();
        Persona_tabla = new Persona();
        usuario = new Usuario();
        nombre = "";
        apellido1 = "";
        apellido2 = "";
        email = "";
        nacionalidad = "";
        telefono1 = "";
        telefono2 = "";
        password = "";
        sexo = "";
        direccion = "";
        tipo = null;
        estadoCivil = null;
        estado = null;
        fecha_nacimiento = null;
        modificar = false;
        setHabilitar(false);
    }

    public void limpiarCampos() {
        try {
            identificacion = null;
            limpiar();
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    public String regresar() {
        return "/xhtml/plantillas/login";
    }

    public void cargarEstadoUsuarios() {
        try {
            lista_estados = new ArrayList<EstadoUsuario>();
            lista_estados = sa.consultarListaEstadoUsuarios();
            if (lista_estados != null && !lista_estados.isEmpty()) {
                mostrar_estado = true;
            } else {
                mostrar_estado = false;
            }
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    /**
     * Método encargado de guardar o actualizar un usuario
     */
    public String guardarUsuario() {
        try {
            if (validarUsuario()) {
                if (persona != null) {
                    Persona persona_g = asignarDatosPersona();
                    scu.guardarPersona(persona_g, true);
                } else {
                    Persona persona_g = asignarDatosPersona();
                    scu.guardarPersona(persona_g, true);
                }


                Usuario usu = asignarDatosUsuario();
                scu.guardarUsuario(usu, false);

                identificacion = "";
                limpiar();
                String mensaje = "Se guardo correctamente el usuario";
                MensajeUtil.agregarMensajeInfo(mensaje);
                return "/xhtml/plantillas/login";
            }
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
        return "";
    }

    /**
     * Método que asigna los datos de un usuario ya sea cuando se va a guardar o
     * actualzar
     *
     * @return Usuario
     */
    public Usuario asignarDatosUsuario() {
        Usuario us = new Usuario();
        us.setId_estado(getEstado());
        us.setIdentificacion(identificacion);
        us.setPass_word(EncriptaUtil.getInstancia().encriptar(password, EncriptaUtil.Algoritmo.MD5));
        us.setTipo_usuario(tipo);
        return us;
    }

    /**
     * Método que asigna los datos del usuario a un objeto de tipo persona
     *
     * @return Persona con los parámetros asignados
     */
    public Persona asignarDatosPersona() {
        Persona persona = new Persona();

        try {
            persona.setNombre(nombre);
            persona.setApellido1(apellido1);
            persona.setApellido2(apellido2);
            persona.setDireccion(direccion);
            persona.setEmail(email);
            persona.setEstadocivil(estadoCivil);
            persona.setFecha_nacimiento(fecha_nacimiento);
            persona.setIdentificacion(identificacion);
            persona.setNacionalidad(nacionalidad);
            persona.setSexo(sexo);
            persona.setTelefono1(telefono1);
            persona.setTelefono2(telefono2);

            Cliente cliente = new Cliente();
            cliente = scu.consultarCliente(identificacion);
            if (cliente != null) {
                persona.setTipo("A");
            } else {
                persona.setTipo("U");
            }


        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }

        return persona;
    }

    /**
     * Método ejecutado cuando el usuario digita la identificación, validando si
     * existe algun usuario con esta identificación y si existiera carga los
     * datos asociados al usuario
     */
    public void accionIdentificacion() {
        try {
            if (identificacion == null || identificacion.isEmpty()) {
                String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Identificación");
                MensajeUtil.agregarMensajeErrorComponente("form_conci:id_idd", mensaje);
                habilitar = false;
            } else {

                Usuario us = scu.consultarUsuario(identificacion);
                if (us != null) {
                    String mensaje = "Usuario ya se encuentra registrado";
                    MensajeUtil.agregarMensajeError(mensaje);
                    limpiar();
                } else {
                    setPersona(new Persona());
                    setPersona(scu.consultarPersona(identificacion));
                    limpiar();
                    if (persona != null) {
                        cargarCamposPersona(persona);
                    }
                    habilitar = true;
                }

            }
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    /**
     * Método que carga en pantalla los datos del usuario de la persona que se
     * recibe como parámetro
     *
     * @param persona Perosona
     */
    public void cargarCamposPersona(Persona persona) {
        nombre = persona.getNombre();
        apellido1 = persona.getApellido1();
        apellido2 = persona.getApellido2();
        email = persona.getEmail();
        telefono1 = persona.getTelefono1();
        telefono2 = persona.getTelefono2();
        sexo = persona.getSexo();
        apellido1 = persona.getApellido1();
        apellido1 = persona.getApellido1();
        apellido1 = persona.getApellido1();
        apellido1 = persona.getApellido1();
        estadoCivil = persona.getEstadocivil();
        nacionalidad = persona.getNacionalidad();
        fecha_nacimiento = persona.getFecha_nacimiento();
        setDireccion(persona.getDireccion());
        identificacion = persona.getIdentificacion();
    }

    /**
     * Método encargado de validar que los datos del usuario que se va a guardar
     * se hayan digitado
     *
     * @return true si esta correcto de lo contrario false
     */
    public boolean validarUsuario() {
        boolean resultado = true;
        try {
            if (nombre == null || nombre.isEmpty()) {
                String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Nombre");
                MensajeUtil.agregarMensajeErrorComponente("form_conci:id_nombre", mensaje);
                resultado = false;
            }

            if (apellido1 == null || apellido1.isEmpty()) {
                String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Primer Apellido");
                MensajeUtil.agregarMensajeErrorComponente("form_conci:id_apellido1", mensaje);
                resultado = false;
            }

            if (apellido2 == null || apellido2.isEmpty()) {
                String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Segundo Apellido");
                MensajeUtil.agregarMensajeErrorComponente("form_conci:id_apellido2", mensaje);
                resultado = false;
            }

            if (identificacion == null || identificacion.isEmpty()) {
                String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Identificación");
                MensajeUtil.agregarMensajeErrorComponente("form_conci:id_idd", mensaje);
                resultado = false;
            }

            if (nacionalidad == null || nacionalidad.isEmpty()) {
                String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Nacionalidad");
                MensajeUtil.agregarMensajeErrorComponente("form_conci:id_nacionalidad", mensaje);
                resultado = false;
            }
            if (email == null || email.isEmpty()) {
                String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "E-mail");
                MensajeUtil.agregarMensajeErrorComponente("form_conci:id_email|", mensaje);
                resultado = false;
            }

            if (!validaCorreo()) {
                resultado = false;
            }

            if (fecha_nacimiento == null) {
                String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Fecha Nacimiento");
                MensajeUtil.agregarMensajeErrorComponente("form_conci:id_fecha_nac", mensaje);
                resultado = false;
            }
            if (sexo == null || sexo.isEmpty()) {
                String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Sexo");
                MensajeUtil.agregarMensajeErrorComponente("form_conci:id_sexo", mensaje);
                resultado = false;
            }

            if (telefono1 == null || telefono1.isEmpty()) {
                String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Teléfono1");
                MensajeUtil.agregarMensajeErrorComponente("form_conci:id_telefono1", mensaje);
                resultado = false;
            }

            if (tipo == null || tipo.isEmpty()) {
                String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Tipo");
                MensajeUtil.agregarMensajeErrorComponente("form_conci:id_tipo", mensaje);
                resultado = false;
            }

            if (getEstadoCivil() == null || getEstadoCivil().isEmpty()) {
                String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Estado civil");
                MensajeUtil.agregarMensajeErrorComponente("form_conci:id_estado_civil", mensaje);
                resultado = false;
            }

            if (mostrar_estado && (getEstado() == null || getEstado() == 0)) {
                String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Estado");
                MensajeUtil.agregarMensajeErrorComponente("form_conci:id_estado", mensaje);
                resultado = false;
            }

            if (getDireccion() == null || getDireccion().isEmpty()) {
                String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Dirección");
                MensajeUtil.agregarMensajeErrorComponente("form_conci:id_direccion", mensaje);
                resultado = false;
            }


            if (password == null || password.isEmpty()) {
                String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Contraseña");
                MensajeUtil.agregarMensajeErrorComponente("form_conci:passwd", mensaje);
                resultado = false;
            }


            if (rep_password == null || rep_password.isEmpty()) {
                String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Repetir Contraseña");
                MensajeUtil.agregarMensajeErrorComponente("form_conci:rep_passwd", mensaje);
                resultado = false;
            }

            if (password != null && rep_password != null && !password.isEmpty() && !rep_password.isEmpty()
                    && !EncriptaUtil.getInstancia().encriptar(rep_password, EncriptaUtil.Algoritmo.MD5).equals(EncriptaUtil.getInstancia().encriptar(password, EncriptaUtil.Algoritmo.MD5))) {
                String mensaje = "Las contraseñas no coinciden";
                MensajeUtil.agregarMensajeErrorComponente(new String[]{"form_conci:rep_passwd", "form_conci:passwd"}, mensaje);
                MensajeUtil.agregarMensajeError(mensaje);
                resultado = false;
            } else {

                if (password != null && rep_password != null && !password.isEmpty() && !rep_password.isEmpty() && password.length() < 8) {
                    String mensaje = "8 caracteres como mínimo";
                    MensajeUtil.agregarMensajeErrorComponente(new String[]{"form_conci:rep_passwd", "form_conci:passwd"}, mensaje);
                    MensajeUtil.agregarMensajeError(mensaje);
                    resultado = false;
                }
            }
            Usuario us = scu.consultarUsuario(identificacion);
            if (us != null) {
                String mensaje = "Usuario ya se encuentra registrado";
                MensajeUtil.agregarMensajeError(mensaje);
            }
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);

        }

        return resultado;
    }

    /**
     * Método que valida si el correo que se va a guardar ya esta asignado a
     * otra persona
     */
    public boolean validaCorreo() {
        boolean resultado = true;
        try {
            if (email != null && !email.isEmpty()) {
                boolean existe = scu.consultarExisteCorreo(identificacion, email);
                if (existe) {
                    String mensaje = "El email ya esta asignado a otra persona";
                    MensajeUtil.agregarMensajeErrorComponente("form_conci:id_email", mensaje);
                    resultado = false;
                }

                if (new EmailValidator().isValid(email, null)) {
                } else {
                    String mensaje = "Correo electrónico incorrecto. "
                            + "Error con el formato de correo electrónico";
                    MensajeUtil.agregarMensajeErrorComponente("form_conci:id_email", mensaje);
                    resultado = false;

                }
            }
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
        return resultado;
    }

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<      GET & SET      >>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    /**
     * @return the lista_usuarios
     */
    public List<Persona> getLista_usuarios() {
        return lista_usuarios;
    }

    /**
     * @param lista_usuarios the lista_usuarios to set
     */
    public void setLista_usuarios(List<Persona> lista_usuarios) {
        this.lista_usuarios = lista_usuarios;
    }

    /**
     * @return the identificacion
     */
    public String getIdentificacion() {
        return identificacion;
    }

    /**
     * @param identificacion the identificacion to set
     */
    public void setIdentificacion(String identificacion) {
        this.identificacion = identificacion;
    }

    /**
     * @return the nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * @param nombre the nombre to set
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * @return the apellido1
     */
    public String getApellido1() {
        return apellido1;
    }

    /**
     * @param apellido1 the apellido1 to set
     */
    public void setApellido1(String apellido1) {
        this.apellido1 = apellido1;
    }

    /**
     * @return the apellido2
     */
    public String getApellido2() {
        return apellido2;
    }

    /**
     * @param apellido2 the apellido2 to set
     */
    public void setApellido2(String apellido2) {
        this.apellido2 = apellido2;
    }

    /**
     * @return the nacionalidad
     */
    public String getNacionalidad() {
        return nacionalidad;
    }

    /**
     * @param nacionalidad the nacionalidad to set
     */
    public void setNacionalidad(String nacionalidad) {
        this.nacionalidad = nacionalidad;
    }

    /**
     * @return the fecha_nacimiento
     */
    public Date getFecha_nacimiento() {
        return fecha_nacimiento;
    }

    /**
     * @param fecha_nacimiento the fecha_nacimiento to set
     */
    public void setFecha_nacimiento(Date fecha_nacimiento) {
        this.fecha_nacimiento = fecha_nacimiento;
    }

    /**
     * @return the sexo
     */
    public String getSexo() {
        return sexo;
    }

    /**
     * @param sexo the sexo to set
     */
    public void setSexo(String sexo) {
        this.sexo = sexo;
    }

    /**
     * @return the telefono1
     */
    public String getTelefono1() {
        return telefono1;
    }

    /**
     * @param telefono1 the telefono1 to set
     */
    public void setTelefono1(String telefono1) {
        this.telefono1 = telefono1;
    }

    /**
     * @return the telefono2
     */
    public String getTelefono2() {
        return telefono2;
    }

    /**
     * @param telefono2 the telefono2 to set
     */
    public void setTelefono2(String telefono2) {
        this.telefono2 = telefono2;
    }

    /**
     * @return the email
     */
    public String getEmail() {
        return email;
    }

    /**
     * @param email the email to set
     */
    public void setEmail(String email) {
        this.email = email;
    }

    /**
     * @return the password
     */
    public String getPassword() {
        return password;
    }

    /**
     * @param password the password to set
     */
    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * @return the modificar
     */
    public boolean isModificar() {
        return modificar;
    }

    /**
     * @param modificar the modificar to set
     */
    public void setModificar(boolean modificar) {
        this.modificar = modificar;
    }

    /**
     * @return the rep_password
     */
    public String getRep_password() {
        return rep_password;
    }

    /**
     * @param rep_password the rep_password to set
     */
    public void setRep_password(String rep_password) {
        this.rep_password = rep_password;
    }

    /**
     * @return the tipo
     */
    public String getTipo() {
        return tipo;
    }

    /**
     * @param tipo the tipo to set
     */
    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    /**
     * @return the direccion
     */
    public String getDireccion() {
        return direccion;
    }

    /**
     * @param direccion the direccion to set
     */
    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    /**
     * @return the habilitar
     */
    public boolean isHabilitar() {
        return habilitar;
    }

    /**
     * @param habilitar the habilitar to set
     */
    public void setHabilitar(boolean habilitar) {
        this.habilitar = habilitar;
    }

    /**
     * @return the estadoCivil
     */
    public String getEstadoCivil() {
        return estadoCivil;
    }

    /**
     * @param estadoCivil the estadoCivil to set
     */
    public void setEstadoCivil(String estadoCivil) {
        this.estadoCivil = estadoCivil;
    }

    /**
     * @return the usuario
     */
    public Usuario getUsuario() {
        return usuario;
    }

    /**
     * @param usuario the usuario to set
     */
    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    /**
     * @return the persona_select
     */
    public Persona getPersona_select() {
        return persona_select;
    }

    /**
     * @param persona_select the persona_select to set
     */
    public void setPersona_select(Persona persona_select) {
        this.persona_select = persona_select;
    }

    /**
     * @return the Persona_tabla
     */
    public Persona getPersona_tabla() {
        return Persona_tabla;
    }

    /**
     * @param Persona_tabla the Persona_tabla to set
     */
    public void setPersona_tabla(Persona Persona_tabla) {
        this.Persona_tabla = Persona_tabla;
    }

    /**
     * @return the estado
     */
    public Integer getEstado() {
        return estado;
    }

    /**
     * @param estado the estado to set
     */
    public void setEstado(Integer estado) {
        this.estado = estado;
    }

    /**
     * @return the lista_estados
     */
    public List<EstadoUsuario> getLista_estados() {
        return lista_estados;
    }

    /**
     * @param lista_estados the lista_estados to set
     */
    public void setLista_estados(List<EstadoUsuario> lista_estados) {
        this.lista_estados = lista_estados;
    }

    /**
     * @return the persona
     */
    public Persona getPersona() {
        return persona;
    }

    /**
     * @param persona the persona to set
     */
    public void setPersona(Persona persona) {
        this.persona = persona;
    }

    /**
     * @return the mostrar_estado
     */
    public boolean isMostrar_estado() {
        return mostrar_estado;
    }

    /**
     * @param mostrar_estado the mostrar_estado to set
     */
    public void setMostrar_estado(boolean mostrar_estado) {
        this.mostrar_estado = mostrar_estado;
    }
}
